home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1984-02-26 | 5.2 KB | 90 lines |
- 100 '**********************************************************************
- 200 '***** GCOPY - COPY FILES IN BASIC *****
- 300 '***** This program copies files in general, but the lengths *****
- 400 '***** of the source and target files will match only if the *****
- 500 '***** source file length is a multiple of 128 bytes. *****
- 700 '**********************************************************************
- 800 CLS
- 900 COMMON GCHAIN$,F$ 'VARIABLES IN MENU BASED SYSTEM
- 1000 FMTSIZ$="######" 'FORMAT STRING FOR FILE SIZE
- 1100 INPUT "ENTER THE NAME OF THE FILE TO BE COPIED: ";F1$
- 1200 INPUT "ENTER THE NAME OF THE TARGET FILE : ";F2$
- 1300 IF F1$="" THEN F1$=F$ ' DEFAULT IS COPY FROM FILE PASSED.
- 1400 '
- 1500 OPEN F1$ AS 1 LEN=512 'TREAT EVERYTHING AS 512 BYTE RECORDS
- 1600 FCB1% = VARPTR(#1) 'SET PTR TO FCB FOR INPUT FILE
- 1700 BYTESIZ1# = PEEK(FCB1%+17)+256*PEEK(FCB1%+18)+256*256*PEEK(FCB1%+20) +256*256*256*PEEK(FCB1%+19) 'Calculate file size in bytes
- 1800 TDATE% = PEEK(FCB1%+21) OR 256*PEEK(FCB1%+22) 'Get file date
- 1900 GOSUB 8300 'Convert date to character format
- 2000 PRINT F1$; TAB(15); ' Format and print file name
- 2100 PRINT USING FMTSIZ$; BYTESIZ1# ; ' and file size
- 2200 PRINT TAB(22) ; SDATE$ ' and the last modified date
- 2300 IF BYTESIZ1# = 0 THEN PRINT "SOURCE FILE IS EMPTY!"
- 2400 OPEN F2$ AS 2 LEN=512 'TREAT EVERYTHING AS 512 BYTE RECORDS
- 2500 FCB2% = VARPTR(#2) 'SET PTR TO FCB FOR INPUT FILE
- 2600 BYTESIZ2# = PEEK(FCB2%+17)+256*PEEK(FCB2%+18)+256*256*PEEK(FCB2%+20) +256*256*256*PEEK(FCB2%+19) ' It's a four byte field & blows >32767
- 2700 TDATE% = PEEK(FCB2%+21) OR 256*PEEK(FCB2%+22)
- 2800 GOSUB 8300
- 2900 PRINT F2$; TAB(15); ' Print the file name
- 3000 PRINT USING FMTSIZ$; BYTESIZ2# ; ' and file size
- 3100 PRINT TAB(22) ; SDATE$ ' and the last modified date
- 3200 IF BYTESIZ1# = 0 THEN 4200
- 3300 INPUT "TARGET FILE CONTAINS DATA. RELY 'YES' TO OVERLAY:"; A$
- 3400 IF A$ = "YES" OR A$ = "yes" THEN 3500 ELSE PRINT "COPY CANCELLED." : GOTO 6600
- 3500 '*************************************************************************
- 3600 '** *******
- 3700 '** DO THE COPY *******
- 3800 '** *******
- 3900 '*************************************************************************
- 4000 FIELD #1, 255 AS A1$, 255 AS A2$, 2 AS A3$ 'STUFF IN RECORDS
- 4100 FIELD #2, 255 AS B1$, 255 AS B2$, 2 AS B3$
- 4200 BLKCT% = BYTESIZ1# \512 'NO. OF BYTES IN LAST BLK
- 4300 REMCT% = BYTESIZ1#-512*BLKCT% 'NO. OF BYTES IN LAST BLK
- 4400 FOR I% = 1 TO BLKCT%
- 4500 GET #1,I% ' READ 512 BYTE SECTOR
- 4600 LSET B1$ = A1$ ' 1ST 255 CHARS
- 4700 LSET B2$ = A2$ ' 2ND 255 CHARS
- 4800 LSET B3$ = A3$ ' LAST 2 CHARS
- 4900 PUT #2,I% ' PUT THE SECTOR
- 5000 NEXT I%
- 5100 IF REMCT% = 0 THEN GOTO 6500
- 5200 GET #1
- 5300 CLOSE #2: OPEN F2$ FOR APPEND AS #2 ,HANDLE SHORT LAST SECTOR
- 5400 '
- 5500 ' ==> THERE IS A PROBLEM HERE: BASIC ONLY RECOGNIZES 128 BYTE INCREMENTS.
- 5600 ' ==> THEREFORE , EVEN IF THE SOURCE FILE LENGTH IS NOT A MULTIPLE OF
- 5700 ' ==> 128 , THE TARGET FILE WILL BE...
- 5800 '
- 5900 IF REMCT% > 510 THEN FIELD #1, 255 AS AA1$, 255 AS AA2$, 1 AS AA3$: PRINT #2, AA1$;: PRINT #2, AA2$;: PRINT #2, AA3$;: GOTO 6500
- 6000 IF REMCT% > 255 AND REMCT% <= 510 THEN FIELD #1, 255 AS AA1$, REMCT% - 255 AS AA2$ : PRINT #2, AA1$;: PRINT #2,AA2$;: GOTO 6500
- 6100 IF REMCT% > 0 AND REMCT% <= 255 THEN FIELD #1, REMCT% AS AA1$
- 6200 PRINT #2,AA1$
- 6300 '*************************************************************************
- 6400 PRINT "COPY COMPLETE from "; F1$ " TO "; F2$; ". ";BLKCT%;" BLKS COPIED"
- 6500 CLOSE
- 6700 STOP: END
- 6800 'S************************************************************************
- 6900 '***** CONVERT THE CURRENT DATE TO INTERNAL FORMAT *******
- 7000 '***** INPUT - SDATE$ OUTPUT - TDATE% *******
- 7100 '*************************************************************************
- 7200 DTMO% = VAL(MID$(SDATE$,1,2)) * 32 'month in bits 8 to 5
- 7300 DTDA% = VAL(MID$(SDATE$,4,2)) 'day of the month
- 7400 DTYR% = (VAL(MID$(SDATE$,7,4)) - 1980) * 512 'year relative to 1980
- 7500 TDATE% = DTYR% OR DTMO% OR DTDA%
- 7600 RETURN
- 7700 'S************************************************************************
- 7800 '***** CONVERT A DATE FROM INTERNAL FORMAT TO STRING FORMAT *******
- 7900 '***** INPUT - TDATE% OUTPUT - SDATE$ *******
- 8000 '***** Refer to page E-8 in the appendix of the DOS manual *******
- 8100 '***** for the internal date format. *******
- 8200 '*************************************************************************
- 8300 DTYR% = (TDATE% \ 512 ) + 1980
- 8400 DTI% = (TDATE% - (DTYR% - 1980) * 512)
- 8500 DTMO% = DTI% \ 32
- 8600 DTDA% = DTI% - DTMO% * 32
- 8700 SDATE$ = "0m-0d-YYYY"
- 8800 MID$( SDATE$,1,2 ) = RIGHT$( STR$(DTMO%+100) ,2)
- 8900 MID$( SDATE$,4,2 ) = RIGHT$( STR$(DTDA%+100), 2 )
- 9000 MID$( SDATE$,7,4 ) = RIGHT$( STR$(DTYR%), 4 )
- 9100 RETURN
-